'''
Created on Mar 1, 2020
Pytorch Implementation of LightGCN in
Xiangnan He et al. LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation

@author: Jianbai Ye (gusye@mail.ustc.edu.cn)
'''
#argparse：Python自带的命令行参数解析
import argparse


def parse_args():
    #argparse.ArgumentParser用于创建命令行参数解析器。
    parser = argparse.ArgumentParser(description="Go lightGCN")
    """
    add_argument(): 这是ArgumentParser类的一个方法，用于添加一个新的命令行参数。
    '--bpr_batch': 这是新添加的命令行参数的名称。当用户在命令行中使用这个参数时，需要使用这个名称（例如：--bpr_batch 1024）。
    type=int: 这意味着该参数需要是一个整数。如果用户提供的值不是整数，程序将会报错。
    default=2048: 这意味着如果没有明确提供--bpr_batch参数的值，那么它的默认值会是2048。
    help="the batch size for bpr loss training procedure": 这是当用户在命令行中使用-h或--help参数时显示的帮助信息
    """
    #batch数量
    parser.add_argument('--bpr_batch', type=int,default=2048,
                        help="the batch size for bpr loss training procedure")
    #embedding维度
    parser.add_argument('--recdim', type=int,default=64,
                        help="the embedding size of lightGCN")
    #LGCN运行轮数
    parser.add_argument('--layer', type=int,default=3,
                        help="the layer num of lightGCN")
    #学习率
    parser.add_argument('--lr', type=float,default=0.001,
                        help="the learning rate")
    #l2正则化惩罚力度
    parser.add_argument('--decay', type=float,default=1e-4,
                        help="the weight decay for l2 normalizaton")
    #是否使用dropout丢弃
    parser.add_argument('--dropout', type=int,default=0,
                        help="using the dropout or not")
    #bpr评估的batchsize
    parser.add_argument('--keepprob', type=float,default=0.6,
                        help="the batch size for bpr loss training procedure")
    #该参数用于指定如何分割大型邻接矩阵。如果没有提供该参数的值，其默认值为100
    parser.add_argument('--a_fold', type=int,default=100,
                        help="the fold num used to split large adj matrix, like gowalla")
    #测试时的batch大小
    parser.add_argument('--testbatch', type=int,default=100,
                        help="the batch size of users for testing")
    #选择数据集
    parser.add_argument('--dataset', type=str,default='gowalla',
                        help="available datasets: [lastfm, gowalla, yelp2018, amazon-book]")
    #保存参数的位置
    parser.add_argument('--path', type=str,default="./checkpoints",
                        help="path to save weights")
    #topk推荐
    parser.add_argument('--topks', nargs='?',default="[20]",
                        help="@k test list")
    #是否开启tensorboard 用于数据可视化
    parser.add_argument('--tensorboard', type=int,default=1,
                        help="enable tensorboard")
    parser.add_argument('--comment', type=str,default="lgn")
    parser.add_argument('--load', type=int,default=0)
    #训练轮数
    parser.add_argument('--epochs', type=int,default=1000)
    #是否使用多线程运行测试集
    parser.add_argument('--multicore', type=int, default=0, help='whether we use multiprocessing or not in test')
    #是否使用已经训练好的参数
    parser.add_argument('--pretrain', type=int, default=0, help='whether we use pretrained weight or not')
    #随机数种子
    parser.add_argument('--seed', type=int, default=2020, help='random seed')
    #选择模型
    parser.add_argument('--model', type=str, default='lgn', help='rec-model, support [mf, lgn]')
    #parser.add_argument('--model', type=str, default='mf', help='rec-model, support [mf, lgn]')
    return parser.parse_args()
